package com.ftz.examinationsystem.dao;

import com.ftz.examinationsystem.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Repository
@Mapper
public interface UserMapper {
    /**
     * 导入学生数据到数据库
     * @param list 学生列表
     */
    void saveAll(List<Student> list);

    /**
     * 查询所有学生信息
     * @param page 分页参数
     * @return
     */
    List<Student> showAll(Page page);

    /**
     * 返回数据库学生信息数量
     * @param page
     * @return
     */
    Long countStu(Page page);

    /**
     * 增加机房
     * @param room 机房信息
     * @return
     */
    int addRoom(Room room);

    /**
     * 按条件查询所有机房
     * @param roomQuery 查询条件
     * @return
     */
    List<Room> getRoomList(RoomQuery roomQuery);

    /**
     * 返回机房数量
     * @param roomQuery 查询条件
     * @return
     */
    Long countRoomList(RoomQuery roomQuery);

    /**
     * 根据id查找机房
     * @param id id号
     * @return
     */
    Room getRoomById(Integer id);

    /**
     * 修改机房信息
     * @param room 机房信息
     */
    void updateRoom(Room room);

    /**
     * 删除机房
     * @param ids 机房号的集合
     */
    void deleteRooms(String ids);

    /**
     * 根据机房号删除所有考场信息
     * @param ids
     */
    void deleteAllByRoomId(String ids);

    /**
     * 根据机房号删除所有考生
     * @param ids
     */
    void deleteAllStuByRoomId(String ids);

    /**
     * 根据机房号修改学生状态为未安排状态
     * @param ids
     */
    void updateStuStateByRoomId(String ids);

    /**
     * 查询所有学生信息（没有分页）
     * @return
     */
    List<Student> showStu();

    /**
     * 删除所有学生信息
     */
    void deleteStus();

    /**
     * 查询所有机房地址
     * @return
     */
    List<String> queryRoomAddr();

    /**
     * 查询所有机房信息
     * @return
     */
    List<Room> queryRoom();

    /**
     * 机房考场分配
     * @param eRorders
     * @return
     */
    int arrangerRoom(List<ERorder> eRorders);

    /**
     * 导入学生信息后增加课程名称
     * @param cname
     */
    void updateStu(String cname);

    /**
     * 查询三个校区分别有多少学生
     * @return
     */
    List<Integer> countStus(String cname);

    /**
     * 查询三个校区分别有多少机房
     * @return
     */
    List<Integer> countRooms();

    /**
     * 根据课程查询机房号和考试日期
     * @param cname
     * @return
     */
    List<Map<Object,Object>> selectIdDate(String cname);

    /**
     * 查询考试日期
     * @param cname
     * @return
     */
    List<String> selectDate(String cname);

    /**
     * 查询某一天某场考试所有机房考场数
     * @param cname
     * @param times
     * @return
     */
    List<Map<Object,Object>> selectRoomNumber(String cname,String times);

    /**
     * 获取所有考试课程名
     * @return
     */
    List<String> selectCourse();

    /**
     * 根据条件查询考试机房
     * @param roomQuery
     * @return
     */
    List<OrderRoom> geteRoomList(eRoomQuery roomQuery);

    /**
     * 考试机房数量
     * @param roomQuery
     * @return
     */
    Long counteRoomList(eRoomQuery roomQuery);

    /**
     * 查询某个机房某天考试安排的开始和结束时间
     * @param times
     * @param roomid
     * @return
     */
    List<Map<Object,Object>> selectTime(String times,Integer roomid);

    /**
     * 删除已排考试机房信息
     * @param ids 每场考试编号
     * @return
     */
    int deleteERooms(String ids);

    /**
     * 删除考试机房表所有数据
     */
    void deleteRoom();
    int countRoom();

    /**
     * 计算每个校区某门课未安排考试的学生人数
     * @param cname
     * @param state
     * @param campus
     * @return
     */
    int countStustate(String cname,Integer state,Integer campus);

    /**
     * 查询某门课未安排学生的前n条数据
     * @param cname
     * @param state
     * @param limit
     * @return
     */
    List<Student> selectStuLimit(String cname,Integer state,Integer limit,Integer campus);

    /**
     * 更新state状态由未安排到安排
     * @param state
     * @param limit
     * @param campus
     * @param cname
     * @return
     */
    int updateState(Integer state,Integer limit,Integer campus,String cname);

    /**
     * 根据考场安排学生
     * @param eStudents
     * @return
     */
    int arrangeStu(List<EStudent> eStudents);

    /**
     * 根据条件查询学生考试信息
     * @param query
     * @return
     */
    List<StuDetail> getStuArrangeDetail(eRoomQuery query);

    /**
     * 查询学生考试信息数量
     * @param query
     * @return
     */
    Long countArrangeDetaile(eRoomQuery query);

    /**
     * 删除所有已排考生信息
     */
    void deleteStuAll();
    int countStuAll();
    int updateArrangeState();

    /**
     * 根据课程名查询没有安排考试的学生
     * @param cname
     * @return
     */
    List<Student> selectUnState(String cname);

    /**
     * 根据机房号和考试日期查找所有考试时间段
     * @param examDate
     * @param roomid
     * @return
     */
    List<Map<Object,Object>> selectAllTime(String examDate,Integer roomid);

    /**
     * 根据机房名查找机房号
     * @param name
     * @return
     */
    Integer selectIdByName(String name);

    /**
     * 根据机房id查找校区
     * @param id
     * @return
     */
    Integer queryCampusById(Integer id);

    /**
     * 根据日期和开始结束时间查找本场考试编号
     * @param examdate
     * @param start
     * @param end
     * @return
     */
    String selectIdByTime(String examdate,String start,String end,Integer roomid);

    /**
     * 根据日期和开始结束时间查找本场考试人数
     * @param examdate
     * @param start
     * @param end
     * @param roomid
     * @return
     */
    Integer selectNumByTime(String examdate,String start,String end,Integer roomid);

    /**
     * 根据日期和机房考场号查找有多少人
     * @param examdate
     * @param roomid
     * @return
     */
    Integer selectCntByIdDate(String examdate,String roomid);

    /**
     * 根据id和课程名查询学生
     * @param id
     * @param cname
     * @return
     */
    Student SelectStuByIdCname(String id,String cname);

    /**
     * 根据id和课程名更新安排状态
     * @param id
     * @param cname
     * @return
     */
    int updateStateByIdCourse(String id,String cname);

    /**
     * 某门考试某天有多少场
     * @param id
     * @param cname
     * @param dates
     * @return
     */
    Integer cntByIdDateName(Integer id,String cname,String dates);

    /**
     * 根据机房名和考试科目查找所有考试场次
     * @param cname
     * @param roomid
     * @return
     */
    List<ERorder> selectERorderByRoomAddr(String cname,Integer roomid);

    /**
     * 根据课程名查找课程编号
     * @param cname
     * @return
     */
    String selectCIdByCname(String cname);

    /**
     * 根据id和日期查询学生考试信息
     * @param CourseId
     * @param EROrdId
     * @param ExamDate
     * @return
     */
    List<EStudent> selectByIdDate(String CourseId,String EROrdId,String ExamDate);

    /**
     * 清除指定考场指定学生
     * @param ids
     * @param courseid
     * @return
     */
    int deleteStusById(String ids,String courseid);

    /**
     * 修改erorder表参加考试人数
     * @param cname
     * @param erordId
     * @param examDate
     * @return
     */
    int updatanumber(String cname,String erordId,String examDate,int cnt);

    /**
     * 修改交换考场时原考场和现在考场人数
     * @param cname
     * @param erordId
     * @param examDate
     * @param cnt
     * @return
     */
    int setnumber(String cname,String erordId,String examDate,int cnt);

    /**
     * 根据id和课程名更新安排状态
     * @param ids
     * @param cname
     * @return
     */
    int updateStateByIdCourse2(String ids,String cname);

    /**
     * 根据EROrdId，ExamDate，Etype删除erorder中考场信息
     * @param erorder
     * @param examdate
     * @param cname
     * @return
     */
    int deleteerorder(String erorder,String examdate,String cname);

    /**
     * 根据EROrdId，ExamDate，Etype删除estudent中考生信息
     * @param erorder
     * @param examdate
     * @param courseid
     * @return
     */
    int deleteStudents(String erorder,String examdate,String courseid);

    /**
     * 根据机房地址获取容量
     * @param name
     * @return
     */
    int cntByName(String name);

    /**
     * 查询所有学生安排信息
     * @return
     */
    List<StuDetail> selectAllestudent();

    /**
     * 查询所有机房考试信息
     * @return
     */
    List<OrderRoom> selectAllRoom();

    /**
     * 交换考场删除左边考生信息
     * @param stuid
     * @param courseid
     * @param erordid
     * @param examdate
     * @return
     */
    int deleteLeftStu(String stuid,String courseid,String erordid,String examdate);

    /**
     * 根据机房id查询所有考场信息
     * @param id
     * @return
     */
    List<ERorder> selectERorderByRoomid(int id);

    /**
     * 根据考试日期和机房号查找考场编号
     * @param examdate
     * @param roomid
     * @return
     */
    List<String> queryERidBydate(String examdate,Integer roomid);

    /*登录*/
    Admin adminlogin(Admin admin);

    /**
     * 根据昵称查询有多少条数据
     * @param username
     * @return
     */
    int selectByUsername(String username);

    /**
     * 用户注册
     * @param username
     * @param password
     * @return
     */
    int inseruser(String username,String password);

    /**
     * 清除考场时获得考场所有学生id
     * @param erorder
     * @param examDate
     * @param cIdByCname
     * @return
     */
    List<String> queryIDS(String erorder, String examDate, String cIdByCname);

    /**
     * 根据课程名查询课程号
     * @param coursename
     * @return
     */
    String queryIdByName(String coursename);

    /**
     * 根据某一场考试查找所有考生
     * @param examDate
     * @param order
     * @param etype
     * @return
     */
    List<StuDetail> showStuByexam(String examDate, String order, String etype);
}
